package com.everis.util;

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;

/**
 * 
 * @author fsebastiani
 */
public class NumberUtil {

	/**
	 * Retorna un numero aleatorio entre los valores
	 * 
	 * @param i
	 * @param j
	 * @return
	 */
	public static int aleatorio(int i, int j) {
		if (j < i) {
			return (int) (((j - i) + 1) * Math.random() + i);
		}
		else {
			return (int) (((i - j) + 1) * Math.random() + j);
		}
	}

	/**
	 * Retorna un numero aleatorio entre los valores
	 * 
	 * @param i
	 * @param j
	 * @return
	 */
	public static long aleatorio(long l, long l1) {
		if (l1 < l) {
			return (long) (((l1 - l) + 1L) * Math.random() + l);
		}
		else {
			return (long) (((l - l1) + 1L) * Math.random() + l1);
		}
	}

	/**
	 * FORMATEO DE NUMEROS DECIMALES
	 * 
	 * Con esta cadena, "#,#00.0#;(-#,#00.0#)" definimos el formato para los numero positivos y negativos Los # indican valores no obligatorios Los 0
	 * indican que si no hay valor se pondr� un cero
	 */
	public static String getDecimalFormateado(double decimal) {
		String valor = "";
		DecimalFormat df = new DecimalFormat("#0.0;(-#0.0)");
		valor = df.format(decimal);
		return valor;
	}

	public static String formatea_con_separador_miles(long entero_largo) {
		String valor = "", temporal = "";
		DecimalFormat df = new DecimalFormat("#,###,###");
		temporal = df.format(entero_largo);

		for (int i = 0; i < temporal.length(); i++) {
			if (temporal.charAt(i) != '.') {
				valor += temporal.charAt(i);
			}
			else {
				valor += ',';
			}
		}
		return valor;
	}

	public static String getDecimalFormateado(String cadena_decimal, int numero_decimales) {
		String valor = "";

		// Establece la configuraci�n del formateador de numeros decimales.
		DecimalFormatSymbols dformater_rules = new DecimalFormatSymbols();
		dformater_rules.setDecimalSeparator('.');
		DecimalFormat df = new DecimalFormat("0.00", dformater_rules);
		df.setMaximumFractionDigits(numero_decimales);
		df.setMinimumFractionDigits(numero_decimales);
		valor = df.format(cadena_decimal);
		return valor;
	}

	public static String getDecimalFormateado(float decimal, int numero_decimales) {
		String valor = "";

		// Establece la configuraci�n del formateador de numeros decimales.
		DecimalFormatSymbols dformater_rules = new DecimalFormatSymbols();
		dformater_rules.setDecimalSeparator('.');
		dformater_rules.setGroupingSeparator(' ');
		DecimalFormat df = new DecimalFormat("###,###,##0.00", dformater_rules);
		df.setMaximumFractionDigits(numero_decimales);
		df.setMinimumFractionDigits(numero_decimales);
		valor = df.format(decimal);
		return valor;
	}

	public static String getDecimalFormateado(double decimal, int numero_decimales) {
		String valor = "";

		// Establece la configuraci�n del formateador de numeros decimales.
		DecimalFormatSymbols dformater_rules = new DecimalFormatSymbols();
		dformater_rules.setDecimalSeparator('.');
		dformater_rules.setGroupingSeparator(' ');
		DecimalFormat df = new DecimalFormat("###,###,##0.00", dformater_rules);

		df.setMaximumFractionDigits(numero_decimales);
		df.setMinimumFractionDigits(numero_decimales);
		valor = df.format(decimal);
		return valor;
	}
	
	public static String getDecimalFormateado(double decimal, int numero_decimales, char separadorMiles) {
		String valor = "";

		// Establece la configuraci�n del formateador de numeros decimales.
		DecimalFormatSymbols dformater_rules = new DecimalFormatSymbols();
		dformater_rules.setDecimalSeparator('.');
		dformater_rules.setGroupingSeparator(separadorMiles);
		DecimalFormat df = new DecimalFormat("###,###,##0.00", dformater_rules);

		df.setMaximumFractionDigits(numero_decimales);
		df.setMinimumFractionDigits(numero_decimales);
		valor = df.format(decimal);
		return valor;
	}

	public static String entero_a_Hexadecimal(int valor) {
		String valor_hexadecimal = "";

		valor_hexadecimal = Integer.toHexString(valor & 0Xffffff).toUpperCase();

		int num_valores = valor_hexadecimal.length();

		if (num_valores < 6) {
			for (int i = 0; i < 6 - num_valores; i++) {
				valor_hexadecimal = "0" + valor_hexadecimal;
			}
		}
		return valor_hexadecimal;
	}

	public static double redondeaDouble(double valor, int num_decimales) {
		double rpta = 0;
		double power_of_ten = 1;

		while (num_decimales-- > 0) {
			power_of_ten *= 10.0;
		}

		rpta = Math.round(valor * power_of_ten) / power_of_ten;
		return rpta;
	}

	public static double redondeaDouble(String valor_texto, int num_decimales) {
		double valor = Double.parseDouble(valor_texto);;
		double rpta = 0;
		double power_of_ten = 1;

		while (num_decimales-- > 0) {
			power_of_ten *= 10.0;
		}

		rpta = Math.round(valor * power_of_ten) / power_of_ten;
		return rpta;
	}

	public static float redondeaFloat(float valor, int num_decimales) {
		float rpta = 0;
		float power_of_ten = 1;

		while (num_decimales-- > 0) {
			power_of_ten *= 10.0;
		}

		rpta = Math.round(valor * power_of_ten) / power_of_ten;
		return rpta;
	}

	public static boolean isNumber(String cadena) {
		boolean rpta;
		try {
			Integer.parseInt(cadena);
			rpta = true;
		}
		catch (NumberFormatException e) {
			rpta = false;
		}
		return rpta;
	}
}
